#Requires AutoHotkey v2.0

; 数字转换为中文数字表示的函数
NumToChinese(num) {
    
    ; 0 返回 "零"
    if(num == 0){
        return "零"
    }

    ; 映射表，中文数字
    baseNum := []

    baseNum.Push("一")
    baseNum.Push("二")
    baseNum.Push("三")
    baseNum.Push("四")
    baseNum.Push("五")
    baseNum.Push("六")
    baseNum.Push("七")
    baseNum.Push("八")
    baseNum.Push("九")
    baseNum.Push("十")
    baseNum.Push("十一")
    baseNum.Push("十二")
    baseNum.Push("十三")
    baseNum.Push("十四")
    baseNum.Push("十五")
    baseNum.Push("十六")
    baseNum.Push("十七")
    baseNum.Push("十八")
    baseNum.Push("十九")
    
    ; 映射表，中文数位
    large := []

    large.push("")
    large.Push("十")
    large.push("百")
    large.push("千")
    large.push("万")
    large.push("十万")
    large.push("百万")
    large.push("千万")
    large.push("亿")
    large.push("十亿")
    large.push("百亿")
    large.push("千亿")
    large.push("万亿")

    ; 检查数字是否在映射表中
    loop baseNum.Length{
        if(num == A_Index){
            return baseNum[A_Index]
        }
    }
    
    ; 将数字的各个位的字符从低到高存入数组
    arr := NumberToArray(num) 
    str := "" ; 存储字符串

    loop arr.Length{

        temp := +arr[A_Index] ; 字符串格式转成数字格式
        temp := NumToChinese(temp) ; 根据映射表转换为中文

        if(temp != "零"){ ;0不需要加数位
            temp := temp large[A_Index] ; 加上数位
        }
        str := temp str ; 连接字符串(加在前面)
        
    }
    
    ;去除多余的零
    removeZero := false ; 判断是否删除多余的零
    loop parse str{
        if(A_LoopField == "零"){

            ; 最后一个字是零，去掉它
            if(A_Index == StrLen(str)){
                str := StrReplace(str, "零", "")
                break
            }
            
            ; 零后面有零，去掉(只保留一个零)
            if(SubStr(str, 1, A_Index) == "零"){
                str := StrReplace(str, "零", "")
                continue
            }
        }
    }

    return str
}


; 将数字的各个位的字符从低到高存入数组的函数
NumberToArray(number) {
    arr1 := []
    arr2 := []
    ; 将数字转换为字符串
    str := Format("{:d}", number)
    ; 遍历字符串的每个字符
    Loop Parse, str {
        arr1.Push(A_LoopField)
    }
    
    index := arr1.Length
    Loop arr1.Length{
        arr2.Push(arr1[index--])
    }
    return arr2
}

; 测试
; num1 := 123456
; numArr1 := NumberToArray(num1)
; loop numArr1.Length{
;     MsgBox(numArr1[A_Index])
; }

;MsgBox(NumToChinese(1))   ; 输出 "一"
;MsgBox(NumToChinese(2))   ; 输出 "二"
;MsgBox(NumToChinese(10))  ; 输出 "十"
;MsgBox("大写数字:" NumToChinese(9009))  ; 输出 "十二"
;MsgBox(NumToChinese(100)) ; 输出 "一百"

